package org.swidgets.sinputdata;


import java.util.Date;

public class Utilita {

    public static final int MAGGIORE = 1;
    public static final int MINORE = 2;
    public static final int UGUALE = 3;
    
    
    
    
    public static final int MILLS_IN_DAY = 86400000;

    private static int[] durataMesi = {31,28,31,30,31,30,31,31,30,31,30,31};

    private static String[] nameMonths = new String[] {"Gennaio", "Febbraio", "Marzo",
			"Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre",
			"Novembre", "Dicembre" };

	private static String[] nameDays = new String[] { "Domenica", "Lunedi", "Martedi",
			"Mercoledi", "Giovedi", "Venerdi", "Sabato" };

	public static String formattaData(Date date) {
		if (date == null) {
			return "";
		}
		return formattaData(getMonthDay(date), getMonth(date), getYear(date));
	}

	public static String formattaData(int day, int month, int year) {
		String dayStr = day+"";
		String monthStr = month+"";
		String yearStr = year+"";

		if(dayStr.length()==1) dayStr = "0" + dayStr;
		if(monthStr.length()==1)monthStr = "0"+monthStr;
		if(yearStr.length()>2)yearStr = yearStr.substring(yearStr.length()-2);
		return dayStr+"/"+monthStr+"/"+yearStr;
	}

	public static String periodoContextToString(Date date) {
		if (date == null) {
			return "";
		}

		return formattaDataContext(getMonthDay(date), getMonth(date), getYear(date));
	}
	private static String formattaDataContext(int day, int month, int year) {
		String dayStr = day+"";
		String monthStr = month+"";
		String yearStr = year+"";

		if(dayStr.length()==1) dayStr = "0" + dayStr;
		if(monthStr.length()==1)monthStr = "0"+monthStr;
		if(yearStr.length()>2)yearStr = yearStr.substring(yearStr.length()-2);
		int intAnno = ctlYear(Integer.valueOf(yearStr).intValue());
		return dayStr+"/"+monthStr+"/"+intAnno;
	}

	public static String formattaOra(int ore,int minuti,int secondi) {
		String oreStr = ore+"";
		String minutiStr = minuti+"";
		String secondiStr = secondi+"";

		if(oreStr.length()==1)oreStr = "0"+oreStr;
		if(minutiStr.length()==1)minutiStr = "0"+minutiStr;
		if(secondiStr.length()==1)secondiStr = "0"+secondiStr;

		return oreStr+":"+minutiStr+":"+secondiStr;
	}



	public static int distanzaTraDate(Date dt1, Date dt2) throws Exception {
    	//il precedente medoto non funzionava bene
		//return confronto(dt1, dt2) == MAGGIORE ? calcoloDistanza(dt1, dt2) - 1 : (confronto(dt1, dt2) == UGUALE ? 0 : (calcoloDistanza(dt2, dt1) - 1) * (-1));
    	
		long deltaDays = ( dt1.getTime() - dt2.getTime() )/ MILLS_IN_DAY;

    	if(deltaDays < 0 )
    		deltaDays = deltaDays * -1;



    	return new Long(deltaDays).intValue()+1;



    }

    public static int confronto(Date dt1, Date dt2) throws Exception {
        int risultato = -1;
        int dts1 = new Integer(getYear(dt1) + "" + getMonth(dt1) + "" + getMonthDay(dt1)).intValue();
        int dts2 = new Integer(getYear(dt2) + "" + getMonth(dt2) + "" + getMonthDay(dt2)).intValue();

        if (dts1 > dts2) {
            risultato = MAGGIORE;
        } else {
            if (dts1 < dts2) {
                risultato = MINORE;
            } else {
                if (dts1 == dts2) {
                    risultato = UGUALE;
                } else {
                    throw new Exception("Situazione incongruente");
                }
            }
        }
        return risultato;
    }

    public static boolean isBisestile(int year) throws Exception {
    	String anno = year+"";
        if (anno.length() != 2 && anno.length() != 4) {
            throw new Exception("l'anno deve essere di due o quattro cifre");
        }
        anno = anno.length() == 2 ? "20" + anno : anno;
        int decennio = new Integer(anno.substring(2, 4)).intValue();
        int annoIntero = new Integer(anno).intValue();
        boolean risultato = false;

        if (decennio == 0) {
            if (annoIntero % 400 == 0) {
                risultato = true;
            }
        } else {
            if (annoIntero % 4 == 0) {
                risultato = true;
            }
        }
        return risultato;
    }

//    private static int calcoloDistanza(Date dt1, Date dt2) throws Exception {
//        int risultatoConfronto = confronto(dt1, dt2);
//
//        if (risultatoConfronto == MAGGIORE) {
//            // data1 > data2
//            int gg1 = getMonthDay(dt1);
//            int mm1 = getMonth(dt1);
//            int aa1 = getYear(dt1);
//            int gg2 = getMonthDay(dt2);
//            int mm2 = getMonth(dt2);
//            int aa2 = getYear(dt2);
//            int distanza = 0;
//
//            if (aa1 > aa2) {
//                distanza += calcoloDistanza(getDate(aa2, 12, 31), dt2);
//                distanza += calcoloDistanza(dt1, getDate(aa1, 1, 1));
//                if (aa1 - aa2 > 1) {
//                    for (int index = aa2 + 1; index < aa1; index++) {
//                        distanza += isBisestile(index) ? 366 : 365;
//                    }
//                }
//                return distanza;
//            }
//
//            if (mm1 > mm2) {
//                String mm1s = null;
//                String mm2s = null;
//                mm1s = "0" + String.valueOf(mm1);
//                mm1s = mm1s.length() == 2 ? mm1s : mm1s.substring(1);
//                mm2s = "0" + String.valueOf(mm2);
//                mm2s = mm2s.length() == 2 ? mm2s : mm2s.substring(1);
//                distanza += calcoloDistanza(dt1, getDate(aa1, Integer.parseInt(mm1s), 1));
//                String ultimoGiorno = String.valueOf(getDaysInMonth(getYear(dt2), getMonth(dt2)));
//                distanza += calcoloDistanza(getDate(aa2, mm2, Integer.parseInt(ultimoGiorno)), dt2);
//
//                if (mm1 - mm2 > 1) {
//                    for (int index = mm2 + 1; index < mm1; index++) {
//                        distanza +=  durataMesi[index];
//                        if (index == 2 && isBisestile(aa2)) {
//                            distanza++;
//                        }
//                    }
//                }
//                return distanza;
//            }
//
//            distanza += (gg1 - (gg2 - 1));
//            return distanza;
//        } else {
//            if (risultatoConfronto == MINORE) {
//                // data1 < data2
//                throw new Exception("data1 deve essere >= data2");
//            }
//            return 0;
//        }
//    }
//
//    private static Date calcoloDataIndietro(Date dt, int giorni) throws Exception {
//        int gg = getMonthDay(dt);
//        int mm = getMonth(dt);
//        int aa = getYear(dt);
//
//        // si raggiunge la fine del mese precedente
//        if (gg < getDaysInMonth(aa, mm)) {
//            if (giorni >= gg) {
//                giorni = giorni - gg;
//                mm = (mm == 1) ? 12 : mm - 1;
//                gg = getDaysInMonth(aa, mm);
//                Date dfm = getDate(aa, mm, gg);
//                return calcoloData(dfm, -giorni);
//            } else {
//                gg = gg - giorni;
//                giorni = 0;
//                Date dfm = getDate(aa, mm, gg);
//                return calcoloData(dfm, giorni);
//            }
//        }
//
//        // si calcola da fine mese a fine mese
//        while (giorni >= getDaysInMonth(aa, mm)) {
//            giorni -= getDaysInMonth(aa, mm);
//            mm = (mm == 1) ? 12 : mm - 1;
//            aa = (mm == 12) ? aa - 1 : aa;
//        }
//
//        // si arriva alla data da calcolare
//        giorni = getDaysInMonth(aa, mm) - giorni;
//        return getDate(aa, mm, giorni);
//    }

    public static Date calcoloData(Date dt, int giorni) throws Exception {
	     
    	long aa = dt.getTime() + (Utilita.MILLS_IN_DAY * giorni);
		return new Date(aa);
		
    	/*//System.out.println("data1= "+new Date(aa));
    	
    	if (giorni > 0) {
	         return calcoloDataAvanti(dt, giorni);
	     } else {
	         if (giorni < 0) {
	             return calcoloDataIndietro(dt, Math.abs(giorni));
	         } else {
	             return dt;
	         }
	     }*/
    }

    

//    private static Date calcoloDataAvanti(Date dt, int giorni) throws Exception {
//        int gg = getMonthDay(dt);
//        int mm = getMonth(dt);
//        int aa = getYear(dt);
//
//        // si raggiunge il fine mese
//        if (gg < getDaysInMonth(aa, mm)) {
//            Date dfm = dataFineMese(dt);
//            if (giorni >= distanzaTraDate(dfm, dt)) {
//                giorni -= distanzaTraDate(dfm, dt);
//                return calcoloData(dfm, giorni);
//            } else {
//                return calcoloData(getDate(aa, mm, gg+giorni), 0);
//            }
//        }
//
//        // si calcola da fine mese a fine mese
//        int meseSucc = (mm == 12) ? 1 : mm + 1;
//        int annoSucc = (meseSucc == 1) ? aa + 1 : aa;
//        while (giorni >= getDaysInMonth(annoSucc, meseSucc)) {
//            giorni -= getDaysInMonth(annoSucc, meseSucc);
//            meseSucc = (meseSucc == 12) ? 1 : meseSucc + 1;
//            annoSucc = (meseSucc == 1) ? annoSucc + 1 : annoSucc;
//        }
//
//        // si arriva alla data da calcolare
//        return getDate(annoSucc,meseSucc, giorni);
//    }

    public static Date dataFineMese(Date dt) throws Exception {
        int mm = getMonth(dt);
        int aa = getYear(dt);
        int fineMese = getDaysInMonth(aa, mm);
        return getDate(aa, mm, fineMese);
    }

	public static Date getDate(int year, int month, int day) {
		return new Date(year - 1900, month-1, day);
	}

	public static String dateToString(Date date) {
		if (date == null) {
			return "";
		}

	  	return Utilita.formattaData(getMonthDay(date), getMonth(date), getYear(date));
	}

	public static String dateHourToString(Date date) {
		if (date==null) {
			return "";
		}

	  	return Utilita.formattaData(getMonthDay(date), getMonth(date), getYear(date))
	  			+ " "
	  			+ Utilita.formattaOra(date.getHours(), date.getMinutes(), date.getSeconds());
	}

	/*
	 * Si aspetta una stringa nel formato giusto, altrimenti torna null
	 */
	public static Date stringToDate(String dateTxt) {
		if (dateTxt == null || dateTxt.trim().length() == 0) {
			return null;
		}

		try {
			String[] data = dateTxt.split("/");
			int year = new Integer(data[2]).intValue()-1900;
			return new Date(ctlYear(year), new Integer(data[1]).intValue()-1, new Integer(data[0]).intValue());
		}
		catch(Exception e) {
			return null;
		}
	}

	public static int getDaysInMonth(int year, int month) {
		switch (month-1) {
		case 1:
			if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
				return 29; // leap year
			else
				return 28;
		case 3:
		case 5:
		case 8:
		case 10:
			return 30;
		default:
			return 31;
		}
	}

	public static int getDayOfWeek(Date data){
		return data.getDay();
	}

	public static Date setYear(Date date, int year) {
		date.setYear(year - 1900);
		return date;
	}

	public static int getYear(Date date) {
		return 1900 + date.getYear();
	}

	public static int ctlYear(int year) {
		if(year < 90) {
			year = 2000 + year;
		}
		else if(year < 1000) {
			year = 1900 + year;
		}
		return year;
	}

	public static Date setMonth(Date date, int month) {
		date.setMonth(month-1);
		return date;
	}

	public static int getMonth(Date date) {
		return date.getMonth()+1;
	}

	public static int getMonthDay(Date date) {
		return date.getDate();
	}

	public static int getWeekDay(Date date) {
		return date.getDay();
	}

	public static String[] getNameMonths() {
		return nameMonths;
	}

	public static String getNameMonth(int month) {
		return nameMonths[month-1];
	}

	public static String[] getNameDays() {
		return nameDays;
	}

	public static String getNameDay(int dayInWeek) {
		return nameDays[dayInWeek];
	}

	public static String getTextForDouble(String pesata){
		if(pesata.equals("")){
			return "";
		}
		else{
			String str01 = pesata.replaceAll("\\.", "");
			String str = str01.replace(',', '.');
			return str;
		}
	}
	
	
	public static String formatNumer(double number,int decimali){
		return  formatNumer( number, decimali,  true);
	}

	public static String formatNumer(double number,int decimali, boolean tipoSeparatore){
		/* tipoSeparatore 
		 * true decimali , migliaia .
		 * false decimali .migliai, 
		 * */
		String numberFormated="";
		String virgola=".";
		String punto=",";
		if (!tipoSeparatore){
			virgola=",";
			punto=".";
			
		}
		
		String segno="";
		if(number<0){
			segno="-";
			number=number*-1;
		}
		if (decimali<0) {
			decimali=0;
		}
		else if(decimali==0){
			virgola="";
		}
		if(number == 0){
			return "";
		}
	else{
			String zero="000000000000000000000000000000000";
			int intero = new Double(number).intValue();
			
			String numeroS = number+"";
			String interoS= intero+"";
			String decimalS=numeroS.substring(interoS.length()+1, numeroS.length());
			if(decimali > decimalS.length()){
				int indexZ=decimali-decimalS.length();
				zero=zero.substring(0,indexZ);
			}
			else
			{
				zero="";
			}
			int indice = (decimali>decimalS.length()?decimalS.length():decimali);
			String interoPuntato="";
			String fine="";
			String resto="";
			int lunghezzaIntero =interoS.length();
			switch (lunghezzaIntero%3) {
			case 0:
				resto=interoS;
				break;

			case 1:
				fine=interoS.substring(0,1);
				resto=interoS.substring(1,lunghezzaIntero);
				break;

			case 2:
				fine=interoS.substring(0,2);
				resto=interoS.substring(2,lunghezzaIntero);
				break;
			}
			int j=0;
			for(int i = resto.length(); i>0;i=i-3){
				interoPuntato=resto.substring(i-3,i)+(j==0?"":punto)+interoPuntato;
				j++;
			}
			

			
			numberFormated=segno+fine+(fine.length()<3?"":punto)+interoPuntato+virgola+decimalS.substring(0,indice)+zero;
			
		
			return numberFormated;
		}
	}


		

	public static String getTextFromInteger(Integer integerVal){
		return integerVal == null ? "" : String.valueOf(integerVal.intValue());
	}
	
	
	
}
